#include "error.h"
#include <string.h>

static error_record_t error_records[ERROR_MAX_NUM];

/**
 * @brief 初始化错误记录
 */
int error_init(void)
{
    memset(error_records, 0, sizeof(error_records));
    return 0;
}

/**
 * @brief 软复位
 */
int error_reset(void)
{
    // 可根据实际需求扩展
    return 0;
}

/**
 * @brief 分析并清除所有错误，输出到 buf，每条4字节，高字节在前
 */
int error_analyze(uint8_t *buf, uint16_t *pnum)
{
    if (!buf || !pnum) return -1;
    uint8_t *p = buf;
    uint16_t num = 0;
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_TRUE)
        {
            *p++ = (uint8_t)((error_records[i].err_id >> 8) & 0xFF);
            *p++ = (uint8_t)(error_records[i].err_id & 0xFF);
            *p++ = (uint8_t)((error_records[i].err_para >> 8) & 0xFF);
            *p++ = (uint8_t)(error_records[i].err_para & 0xFF);
            error_records[i].enable = ERROR_FALSE;
            num++;
        }
    }
    *pnum = num;
    return 0;
}

/**
 * @brief 标记新错误（去重）
 */
int error_mark(uint16_t err_id, uint16_t err_para)
{
    // 检查是否已记录
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_TRUE)
        {
            if (error_records[i].err_id == err_id && error_records[i].err_para == err_para)
                return 0; // 已记录
        }
    }
    // 查找空位
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_FALSE)
        {
            error_records[i].enable  = ERROR_TRUE;
            error_records[i].err_id  = err_id;
            error_records[i].err_para= err_para;
            return 0;
        }
    }
    // 没有空位
    return -1;
}

/**
 * @brief 是否有任何错误
 */
int error_has_error(void)
{
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_TRUE)
            return 1;
    }
    return 0;
}

/**
 * @brief 检查指定错误是否存在
 */
int error_check(uint16_t err_id)
{
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_TRUE && error_records[i].err_id == err_id)
            return 1;
    }
    return 0;
}

/**
 * @brief 清除指定错误
 */
int error_clear(uint16_t err_id)
{
    for (int i = 0; i < ERROR_MAX_NUM; i++)
    {
        if (error_records[i].enable == ERROR_TRUE && error_records[i].err_id == err_id)
        {
            error_records[i].enable = ERROR_FALSE;
            return 0;
        }
    }
    return -1;
}